Skip to content

[AMD] dsv4-fp4-mi355x-atom: latest atom-dev image + opt recipe / DSv4-Pro FP4 MI355X ATOM:升级最新 atom-dev 镜像 + 优化配方#2327

Open
zufayu wants to merge 7 commits into
mainfrom
amd/dsv4-fp4-mi355x-atom-latest
Open

[AMD] dsv4-fp4-mi355x-atom: latest atom-dev image + opt recipe / DSv4-Pro FP4 MI355X ATOM:升级最新 atom-dev 镜像 + 优化配方#2327
zufayu wants to merge 7 commits into
mainfrom
amd/dsv4-fp4-mi355x-atom-latest

Conversation

@zufayu

@zufayu zufayu commented Jul 24, 2026

Copy link
Copy Markdown
Collaborator

What

Re-sweep dsv4-fp4-mi355x-atom (DeepSeek-V4-Pro FP4, MI355X) on the latest atom-dev image with an optimized recipe.

Changes

  • Image: nightly_202606161823nightly_202607231538 (latest atom-dev)
  • Recipe (dsv4_fp4_mi355x_atom.sh):
    • --max-num-seqs "$CONC" for all dp-on cells (mandatory: dp-attention keeps a full KV pool per rank, so the large default max_num_seqs OOMs even at low conc like c16/c32) and for conc>=64. dp-off low conc keeps the ATOM default.
    • TBO enabled on dp-attn cells at conc>=64 (was per-scenario gate 256/1024)
  • 8k/1k grid: aligns the AMD dev sweep + keeps a tp8 dp-off low-conc line as redundancy to recheck the dp crossover on the new image

Why the recipe change

AMD internal dev benchmarking shows this recipe beats the prior default:

  • max_num_seqs=conc removes the high-concurrency throughput cap and avoids dp-on OOM
  • TBO gate lowered to conc>=64 from measured crossover (no measurable TBO gain below conc 64 on 8k/1k)

Note for reviewers

Needs the full-sweep-fail-fast label to run the sweep. RANDOM_RANGE_RATIO stays at the repo default (0.8), matching the dev runs.

中文说明

内容

在最新 atom-dev 镜像上用优化配方重跑 dsv4-fp4-mi355x-atom(DeepSeek-V4-Pro FP4,MI355X)的 sweep。

改动

  • 镜像:nightly_202606161823nightly_202607231538(最新 atom-dev)
  • 配方(dsv4_fp4_mi355x_atom.sh):
    • 所有 dp-on cell--max-num-seqs "$CONC"(必需:dp-attention 每 rank 保留完整 KV pool,默认的大 max_num_seqs 即使在 c16/c32 低并发也会 OOM),以及 conc>=64。dp-off 低并发保持 ATOM 默认。
    • dp-attn cell 在 conc>=64 开启 TBO(原为按 scenario 门控 256/1024)
  • 8k/1k 网格:对齐 AMD dev sweep,并保留一条 tp8 dp-off 低并发线作冗余,在新镜像上复核 dp crossover

配方改动原因

AMD 内部 dev benchmark 显示此配方优于原默认:

  • max_num_seqs=conc 去掉高并发吞吐上限,并避免 dp-on OOM
  • TBO 门控从实测 crossover 降到 conc>=64(8k/1k 下 conc 64 以下无可测 TBO 收益)

给 reviewer 的说明

需要 full-sweep-fail-fast label 才能跑 sweep。RANDOM_RANGE_RATIO 保持 repo 默认(0.8),与 dev run 一致。

Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com

zufayu and others added 5 commits July 24, 2026 05:35
- image: nightly_202606161823 -> nightly_202607231538 (latest atom-dev)
- recipe (dsv4_fp4_mi355x_atom.sh): max_num_seqs=conc + TBO on dp-attn cells
  at conc>=64 (was ATOM-default max_num_seqs + TBO per-scenario gate 256/1024)
- add 1k1k scenario (was 8k1k only; mirrors prior grid)
- 8k1k grid: align AMD dev sweep (run 20260723) + tp8 dp-off low-conc redundancy

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
max_req=conc is a mid/high-concurrency optimization. At very low conc (e.g. c2)
the ATOM default is on-par or ~4% better, so only set --max-num-seqs=conc for
conc>=64 (matches the TBO gate). High conc still gets it (removes the cap).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
dp-attention keeps a full KV pool per rank, so the large default
max_num_seqs OOMs even at low conc (c16/c32). Set max_req=conc for
every dp-on cell; dp-off low conc still uses the ATOM default.
TBO gate unchanged (conc>=64).
@github-actions

Copy link
Copy Markdown
Contributor

Thanks for the contribution! Please reach out to respective companies' CODEOWNER to fill in the latest PR_REVIEW_CHECKLIST.md before pinging core maintainer on Slack for review. In order for the signoff PR check bot to trigger, you must follow the PR_REVIEW_CHECKLIST.md template correctly, including the phrase As a PR reviewer and CODEOWNER, I have reviewed this and have.

For PR verification, add the full-sweep-fail-fast label (strongly recommended) to this PR — the benchmark sweep only runs on labeled PRs. Use full-sweep-enabled only if you need matrix jobs to keep running past a failure.

PR authors are responsible for ensuring that after merging, all GitHub Action jobs fully pass. A lot of the time, failures are just flakes and simply re-running the failed jobs will fix it. See GitHub's docs on re-running failed jobs


感谢你的贡献!请联系相应公司的 CODEOWNER 填写最新的 PR_REVIEW_CHECKLIST.md,然后再在 Slack 上联系核心维护者进行审阅。为了触发 signoff PR 检查机器人,你必须正确遵循 PR_REVIEW_CHECKLIST.md 模板,包括保留英文语句 As a PR reviewer and CODEOWNER, I have reviewed this and have

如需进行 PR 验证,请为此 PR 添加 full-sweep-fail-fast 标签(强烈推荐)— 基准测试 sweep 仅在带有标签的 PR 上运行。仅当需要矩阵任务在失败后继续运行时才使用 full-sweep-enabled

PR 作者有责任确保合并后所有 GitHub Action 任务完全通过。 很多时候失败只是偶发抖动(flake),重新运行失败的任务即可解决。参见 GitHub 关于重新运行失败任务的文档

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Beyond the inline findings, I also checked whether the new tp4 dp-attn row (conc 16-128) overlapping the tp4 dp-off row (conc 1-64) contradicts the grid's own crossover comment — it doesn't: the same overlapping-ranges-to-recheck-the-crossover pattern is already used elsewhere in this file (e.g. dsv4-fp4-mi355x-sglang's tp4 dp-attn 16-128 / dp-off 1-32 rows), so this is consistent with existing sweep-design conventions, not a new bug.

Extended reasoning...

The main finding (perf-changelog entry prepended instead of appended) is a real hard-CI-failure per validate_perf_changelog.py, so I'm not approving this PR. I additionally looked into a candidate concern about the tp4 dp-attn/dp-off concurrency ranges overlapping in the new dsv4-fp4-mi355x-atom search-space grid, since it looked like it might contradict the inline crossover comment. Cross-referencing against the rest of configs/amd-master.yaml (e.g. the existing dsv4-fp4-mi355x-sglang entry at tp4 dp-attn 16-128 / dp-off 1-32), the same overlapping-range pattern is already an established convention for rechecking the dp crossover on a new image/config, so this is not an additional bug beyond what's already flagged inline.

Comment thread perf-changelog.yaml Outdated
Comment on lines +1 to +6
- config-keys:
- dsv4-fp4-mi355x-atom
description:
- "Re-sweep dsv4-fp4-mi355x-atom on latest atom-dev nightly (nightly_202607231538, was 202606161823). Recipe: max_num_seqs=conc + TBO on dp-attn cells at conc>=64 (was per-scenario gate 256/1024). 8k1k grid adds tp8 dp-off low-conc redundancy to recheck the crossover on the new image."
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2325

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 The new perf-changelog.yaml entry for dsv4-fp4-mi355x-atom is inserted at line 1 (top of file), but AGENTS.md mandates the changelog is append-only and read chronologically oldest-to-newest, with new entries appended to the end only. This isn't just a style nit — utils/validate_perf_changelog.py enforces byte-for-byte prefix immutability of the base file and will hard-fail CI in its current form; the entry needs to be moved to the end of perf-changelog.yaml.

Extended reasoning...

What's wrong: perf-changelog.yaml is documented in AGENTS.md (line 78) as being read chronologically — "oldest at top, newest at bottom" — with an explicit MUST: "new entries MUST be appended to the END, never inserted in the middle or prepended." Line 39 reiterates the file is "append-only; preserve whitespace." The PR's diff (@@ -1,3 +1,9 @@) instead inserts the new dsv4-fp4-mi355x-atom entry at line 1, pushing the previously-first entry (the 70b-fp8-*-vllm / PR #95 entry, one of the oldest entries in the file) down. I confirmed this against the file currently on disk: the new entry sits at lines 1-6, above #95, while much more recent entries (e.g. PR #2301) remain further down the file.

Why this isn't just a documentation nit: utils/validate_perf_changelog.py mechanically enforces this invariant against exactly this failure mode. validate_raw_change() (line ~211) does:

if not head_raw.startswith(base_raw):
    raise ... "restore the base file byte-for-byte and append at the end"

Since the head file's bytes now begin with the new entry instead of the base file's original first byte, head_raw.startswith(base_raw) is False, and this check fails. Separately, compare_entries() (line ~163) walks base_entries by index and diffs each against the corresponding head_entries[i]; since the new entry is now head_entries[0] while base_entries[0] is still the old 70b-fp8 entry, the comparison finds base_entries[0] != head_entries[0] (beyond an allowed pr-link-only correction) and raises "entry 1 changed; existing entries are immutable except for pr-link-only corrections." Either check alone is sufficient to hard-fail changelog validation in CI.

Step-by-step proof:

  1. Base perf-changelog.yaml (main) starts with the 70b-fp8-*-vllm entry (pr-link: .../pull/95) as its very first bytes.
  2. This PR's diff adds 6 new lines at the very top (hunk @@ -1,3 +1,9 @@), so the head file's first bytes are now the new dsv4-fp4-mi355x-atom entry, and the old 70b-fp8 entry has shifted down to start at what was line 1 in the base but is now offset by 6 lines in the head.
  3. validate_raw_change() computes head_raw.startswith(base_raw) — comparing the head file's first N bytes (N = len(base_raw)) against the base file's bytes. Because the head file's first 6 lines are new content not present in the base at that offset, this is False.
  4. The validator raises: "appended entries changed historical perf-changelog.yaml bytes; restore the base file byte-for-byte and append at the end." This is a hard failure, not a warning.
  5. Independently, compare_entries() parses both files into entry lists and diffs by index; base_entries[0] (the 70b-fp8 entry) no longer matches head_entries[0] (now the new dsv4 entry), raising a second, equally fatal error.

How to fix: Move the 6-line block (lines 1-6 in the diff) to the end of perf-changelog.yaml instead of the top — i.e., apply it as a pure append after the last existing entry, leaving every byte of the current file untouched and unshifted. This also matches the merge-conflict resolution recipe in AGENTS.md (line 100), which explicitly instructs re-appending a PR's own changelog entry "at the tail" when resolving perf-changelog.yaml conflicts, reinforcing that entries always belong at the end.

No refutations to address — all verifiers agreed on this finding, and I independently confirmed both the AGENTS.md rule and the exact validator code path (utils/validate_perf_changelog.py) that will fail CI as a result.

Comment thread perf-changelog.yaml Outdated
Comment on lines +1 to +6
- config-keys:
- dsv4-fp4-mi355x-atom
description:
- "Re-sweep dsv4-fp4-mi355x-atom on latest atom-dev nightly (nightly_202607231538, was 202606161823). Recipe: max_num_seqs=conc + TBO on dp-attn cells at conc>=64 (was per-scenario gate 256/1024). 8k1k grid adds tp8 dp-off low-conc redundancy to recheck the crossover on the new image."
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2325

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 AGENTS.md requires every PR title and description to be bilingual (English title + / <中文标题>, plus a mirrored ## 中文说明 body section), but this PR's title and body (What/Changes/Why/Note) are English-only with no Chinese translation anywhere.

Extended reasoning...

AGENTS.md line 7 states an explicit, mandatory contribution rule: "PR and GitHub-issue titles & descriptions must be bilingual — include a Simplified Chinese version in addition to English." It specifies the required title format as <English title> / <中文标题>, and requires the body to follow the English content with a Chinese translation, e.g. a ## 中文说明 section mirroring the summary. The rule text is unambiguous that "this applies to every PR and every issue."

This PR's title is [AMD] dsv4-fp4-mi355x-atom: latest atom-dev image + opt recipe — no / <中文标题> suffix. The body contains ## What, ## Changes, ## Why the recipe change, and ## Note for reviewers sections, all in English, with no ## 中文说明 section or any Chinese text anywhere in the description. The perf-changelog.yaml entry added by this PR (lines 1-6) is the English-only changelog description that mirrors this English-only PR body, so the same gap is visible in the tracked file content, not just the PR metadata.

Nothing in the existing tooling (the recipe-reminder GitHub Action comment, CI checks, or the PR review checklist bot) enforces or checks for the bilingual title/body requirement — the automated reminder comment covers CODEOWNER review and the full-sweep-fail-fast label, not language compliance. So this rule is only enforced by human/AI reviewers reading AGENTS.md, and it was missed here.

Proof by inspection: comparing the PR's actual title/body against the AGENTS.md-mandated format —

  1. Required title format: <English title> / <中文标题>. Actual title: [AMD] dsv4-fp4-mi355x-atom: latest atom-dev image + opt recipe — no / separator, no Chinese characters present.
  2. Required body: English content followed by a ## 中文说明 section mirroring it. Actual body sections: ## What, ## Changes, ## Why the recipe change, ## Note for reviewers — scanning all of them for any CJK characters turns up none.
  3. Therefore the PR violates the literal, stated rule in AGENTS.md.

Fix is trivial and low-risk: append / <中文标题> to the PR title and add a ## 中文说明 section to the body mirroring the What/Changes/Why content in Simplified Chinese. This is a process/documentation compliance gap, not a functional defect — it doesn't affect the recipe script, the amd-master.yaml config, the benchmark sweep, or correctness of results, so it shouldn't block merge on its own, but it should be fixed to comply with the repo's contribution policy.

Comment thread perf-changelog.yaml Outdated
Comment on lines +1 to +5
- config-keys:
- dsv4-fp4-mi355x-atom
description:
- "Re-sweep dsv4-fp4-mi355x-atom on latest atom-dev nightly (nightly_202607231538, was 202606161823). Recipe: max_num_seqs=conc + TBO on dp-attn cells at conc>=64 (was per-scenario gate 256/1024). 8k1k grid adds tp8 dp-off low-conc redundancy to recheck the crossover on the new image."
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2325

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 The new dsv4-fp4-mi355x-atom changelog entry's pr-link points to #2325, but this entry is introduced by this PR (#2327) — #2325 was the prior dsv4-fp4-mi355x-atom PR. Every other entry in perf-changelog.yaml links to the PR that introduced it, so this should be updated to point to #2327.

Extended reasoning...

The new perf-changelog.yaml entry added by this PR sets pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2325, but this PR is #2327 per the PR metadata (title, description, and diff all describe the changes made in this PR: bumping the atom-dev image to nightly_202607231538, setting max-num-seqs=$CONC on dp-on cells, lowering the TBO gate to conc>=64, and reshaping the 8k1k grid). The changelog entry's description text matches these exact changes, confirming it was authored for and belongs to this PR.\n\nThe convention in perf-changelog.yaml, verified against numerous other entries in the file (e.g. pull/95, pull/110, pull/149), is that each entry's pr-link points to the PR that introduced that specific changelog entry — not to a related or historical PR for the same config-key. This entry breaks that convention by linking to #2325 instead.\n\nGit history explains how the stale value got there: commit bc81345 ("chore: fill pr-link for dsv4-fp4-mi355x-atom changelog (#2325)") shows that #2325 was itself an earlier, separate PR for this same dsv4-fp4-mi355x-atom config that filled in its own pr-link placeholder. When this new entry was added on top for the current re-sweep (PR #2327), the same PR number was seemingly copy-pasted from that prior commit rather than being updated to the current PR.\n\nProof: (1) PR metadata states this PR's number is 2327 and its description matches the new changelog entry's description word-for-word (image bump, max_num_seqs=conc, TBO gate at conc>=64, 8k1k grid changes). (2) The diff shows the changelog entry is wholly new (@@ -1,3 +1,9 @@ adds the full block, not an edit to a pre-existing entry). (3) Recent commit bc81345 in this same branch's history is literally titled "...changelog (#2325)", confirming 2325 refers to a distinct, earlier PR, not this one. (4) No other perf-changelog.yaml entry links to a PR other than the one that introduced it. Together this shows the link should read pull/2327, not pull/2325.\n\nImpact is limited to documentation/traceability: the pr-link field is metadata used to trace a changelog entry back to its introducing PR for future readers or tooling; nothing in the benchmark sweep, recipe script, or config execution reads or depends on this value, so nothing breaks functionally. The fix is a one-line change: update pr-link in perf-changelog.yaml from .../pull/2325 to .../pull/2327.

@zufayu zufayu changed the title [AMD] dsv4-fp4-mi355x-atom: latest atom-dev image + opt recipe [AMD] dsv4-fp4-mi355x-atom: latest atom-dev image + opt recipe / DSv4-Pro FP4 MI355X ATOM:升级最新 atom-dev 镜像 + 优化配方 Jul 24, 2026
@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

6 similar comments
@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

@Klaud-Cold

Copy link
Copy Markdown
Collaborator

❌❌❌ REJECTED ❌❌❌

@zufayu — this comment is not a CODEOWNER sign-off: it is a request for @chunfangamd to review, and it only quotes the checklist trigger phrase (which fired this gate). Blocking issues: no filled-in checklist, signer is not a CODEOWNER for configs/amd-master.yaml, and no /reuse-sweep-run has been posted. The AMD CODEOWNER (@chunfangamd or another owner of configs/amd-master.yaml) must post the actual checklist, and an authorized maintainer must comment /reuse-sweep-run.

❌ Check 0 (CODEOWNER): FAIL — configs/amd-master.yaml is owned by @billishyahao @chunfangamd @seungrokj @yctseng0211 @1am9trash; zufayu is not among them (nor listed anywhere in CODEOWNERS).
✅ Check 1 (sweep on in-PR commit): PASS — head b656b7b has all single-node 8k1k / and eval / jobs success (executed, not skipped) in run 30082074886.
✅ Check 2 (evals real): PASS — gsm8k em_strict 0.964–0.967 across all 6 eval cells (bar for dsv4: 0.91), on the PR's exact image rocm/atom-dev:nightly_202607231538.
➖ Check 3 (upstream recipe link): N/A — ATOM-framework recipe; the recipe-link requirement in docs/PR_REVIEW_CHECKLIST.md covers single-node vLLM/SGLang recipes only.
❌ Check 4 (reuse command): FAIL — no authorized /reuse-sweep-run command has been posted on this PR; an authorized maintainer must comment it before merge via reuse.
❌ Check 5 (latest checklist): FAIL — the sign-off contains none of the current template's items (no [x] checklist at all); post the filled-in PR_REVIEW_CHECKLIST.md template.
✅ Check 6 (upstream images / engine-first): PASS — no vLLM/SGLang entries changed; vLLM entry dsv4-fp4-mi355x-vllm already exists for this model+SKU, so the ATOM entry satisfies engine-first ordering.
✅ Check 7 (no architecture hacks): PASS — diff only adjusts --max-num-seqs, TBO gating, and dp-attn grid; no --hf-overrides or FLOPs-reducing knobs.
➖ Check 8 (spec-decode chat templates): N/A — no speculative-decoding changes in this PR.
✅ Check 9 (no engine patches): PASS — no patch files, heredoc rewrites, or engine reinstalls introduced.
➖ Check 10 (agentic golden AL): N/A — no agentic speculative-decoding changes.

@zufayu

zufayu commented Jul 24, 2026

Copy link
Copy Markdown
Collaborator Author

/stage-results 30082074886

@github-actions

github-actions Bot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

@zufayu staged run 30082074886: https://inferencemax-app-git-staging-semianalysisai.vercel.app/inference?i_dates=2026-07-24~r30082074886

This shared staging slot remains available until the next /stage-results request. Staging workflow

@zufayu

zufayu commented Jul 24, 2026

Copy link
Copy Markdown
Collaborator Author

Hi @chunfangamd — could you review this PR and post the filled-in PR_REVIEW_CHECKLIST from docs/PR_REVIEW_CHECKLIST.md?

The full sweep is green — all TP4/TP8, dp-off/dp-on, throughput and evals passed:

Summary: re-sweep on nightly_202607231538; recipe = max_num_seqs=conc for dp-on cells + conc>=64, TBO at conc>=64; 8k/1k. No engine patch; RANDOM_RANGE_RATIO=0.8 (repo default).

After the checklist, an authorized maintainer needs to comment /reuse-sweep-run to merge via reuse. Thanks!

@zufayu

zufayu commented Jul 25, 2026

Copy link
Copy Markdown
Collaborator Author

Update: rebased on latest main and resolved the perf-changelog.yaml conflict (our dsv4-atom entry appended after #2313). The merge commit is marked [skip-sweep], so it did not re-run the sweep — the 20 bench jobs are correctly skipped. mergeable is now true.

@chunfangamd @seungrokj @billishyahao — could one of you (CODEOWNER for configs/amd-master.yaml) review and post the filled-in PR_REVIEW_CHECKLIST from docs/PR_REVIEW_CHECKLIST.md?

The config/recipe is unchanged from the green sweep — all TP4/TP8, dp-off/dp-on, throughput + evals passed (gsm8k 0.964–0.967, above the 0.91 bar):

Since the [skip-sweep] merge didn't re-run, an authorized maintainer should use /reuse-sweep-run 30082074886 to reuse that sweep's data for merge. Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

2 participants